package com.yuntian.baidu.util;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.yuntian.baidu.vo.Department;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class DepartmentTreeUtils {

    /**
     * 将JSON字符串的树形结构转换为平铺的List
     * @param jsonStr JSON字符串
     * @return 平铺的部门列表
     */
    public static List<Department> flattenDepartmentTree(String jsonStr) {
        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
        JSONArray jsonArray = new JSONArray();
        jsonArray.add(jsonObject); // 将单个对象转为数组形式处理

        return flattenDepartmentTree(jsonArray);
    }

    /**
     * 将JSONArray树形结构转换为平铺的List
     * @param jsonArray 树形结构的JSONArray
     * @return 平铺的部门列表
     */
    public static List<Department> flattenDepartmentTree(JSONArray jsonArray) {
        List<Department> result = new ArrayList<>();
        if (jsonArray == null || jsonArray.isEmpty()) {
            return result;
        }

        // 递归遍历所有节点
        traverseTree(jsonArray, result);
        return result;
    }

    /**
     * 递归遍历树形结构
     * @param nodes 当前层级的节点数组
     * @param result 结果列表
     */
    private static void traverseTree(JSONArray nodes, List<Department> result) {
        if (nodes == null || nodes.isEmpty()) {
            return;
        }

        for (int i = 0; i < nodes.size(); i++) {
            JSONObject node = nodes.getJSONObject(i);

            // 将当前节点转换为Department对象并添加到结果列表
            Department department = JSONUtil.toBean(node, Department.class);
            result.add(department);

            // 递归处理子节点
            JSONArray children = node.getJSONArray("children");
            if (children != null && !children.isEmpty()) {
                traverseTree(children, result);
            }
        }
    }

    /**
     * 简化版本：直接返回JSONObject列表（不转换为Java对象）
     * @param jsonArray 树形结构的JSONArray
     * @return 平铺的JSONObject列表
     */
    public static List<JSONObject> flattenDepartmentTreeToJson(JSONArray jsonArray) {
        List<JSONObject> result = new ArrayList<>();
        if (jsonArray == null || jsonArray.isEmpty()) {
            return result;
        }

        traverseTreeToJson(jsonArray, result);
        return result;
    }

    private static void traverseTreeToJson(JSONArray nodes, List<JSONObject> result) {
        if (nodes == null || nodes.isEmpty()) {
            return;
        }

        for (int i = 0; i < nodes.size(); i++) {
            JSONObject node = nodes.getJSONObject(i);

            // 复制当前节点（避免引用问题）
            JSONObject copyNode = JSONUtil.parseObj(JSONUtil.toJsonStr(node));
            // 移除children字段，避免循环引用
            copyNode.remove("children");
            result.add(copyNode);

            // 递归处理子节点
            JSONArray children = node.getJSONArray("children");
            if (children != null && !children.isEmpty()) {
                traverseTreeToJson(children, result);
            }
        }
    }
}
